/** yipaidaojia
 * - 登录&注册 {云对象} 登录/注册系列云对象
 *  第三方技术支持来自uniCloud云对象教程: https://uniapp.dcloud.net.cn/uniCloud/cloud-obj
 * jsdoc语法提示教程：https://ask.dcloud.net.cn/docs/#//ask.dcloud.net.cn/article/129
 * @param tel 17664189378 冀** 
    200 OK - 请求成功，用户已经成功登录。
    400 Bad Request - 请求错误，登录请求中可能包含无效或不完整的信息。
    401 Unauthorized - 未经授权，表示用户没有提供有效的凭据或未登录，需要进行身份验证。
    403 Forbidden - 禁止访问，表示用户已经登录，但没有足够的权限来访问所请求的资源。
    404 Not Found - 找不到资源，表示请求的登录页面或处理登录请求的端点不存在。
    500 Internal Server Error - 服务器内部错误，表示服务器在处理登录请求时遇到了问题。
 */
const dbjql = uniCloud.databaseForJQL()
const db = uniCloud.database()
module.exports = {
	_before: function() {
		// 通用预处理器
	},
	/**
	 * 商家端手机号注册 
	 * @param {string} mobile 注册手机号
	 * @param {object} Register 注册环境数据
	 * @param {object} headAndNickname 头像和名称
	 * @param {string} username 用户名
	 * @returns {object} 返回值对象类型 code：200为正确调用
	 */
	async onMobileRegister(mobile, headAndNickname, username) {
		// 参数校验
		if (!mobile || !headAndNickname || !username) {
			return {
				error: '参数不完整',
				code: 404
			};
		}
		const dbjql = uniCloud.databaseForJQL()
		const db = uniCloud.database()
		try {
			const clientInfo = this.getClientInfo()
			// 构建新用户数据
			var Data = {
				// 构建当前登录环境
				register_env: {
					appid: clientInfo.appId,
					uni_platform: clientInfo.platform,
					os_name: clientInfo.osName,
					app_name: clientInfo.appName,
					app_version: clientInfo.appVersion,
					app_version_code: clientInfo.appVersionCode,
					device_id: clientInfo.deviceId,
					ua: clientInfo.ua,
					channel: "mobile-login",
					client_ip: clientInfo.clientIP
				},
				mobile: mobile,
				register_ip: clientInfo.clientIP,
				last_login_ip: clientInfo.clientIP,
				last_login_date: new Date().getTime(),
				avatar: headAndNickname.headimage,
				username: username,
				nickname: headAndNickname.nickname
			}
			// 添加新用户 new
			var addUser = await dbjql.collection("uni-id-users").add(Data)
			// 查询出新增用户
			var userData = await dbjql.collection("uni-id-users").doc(addUser.id).field("_id,business,username,mobile,money").get({getOne: true})
			return {
				code: 200,
				message: '注册成功',
				result: userData.data
			}
		} catch (error) {
			return {
				error: '内部错误',
				code: 500,
				message: err,
			};
			dbJQL.collection('users_log').add({
				type: 2,
				text: `店铺${Data.shop_id},在‘获取可提现金额’方法时发生错误：${err}`
			})
		}
	},
	/**
	 * 商家端手机号登录 
	 * @param {string} ID 用户登录ID
	 * @returns {object} 返回值对象类型 code：200为正确调用
	 */
	async onMobileLogin(ID) {
		// 参数校验
		if (!ID) {
			return {
				error: '参数不完整',
				code: 404
			};
		}
		const dbjql = uniCloud.databaseForJQL()
		const db = uniCloud.database()
		try {
			const clientInfo = this.getClientInfo()
			// 修改当前用户最后登陆环境
			await dbjql.collection("uni-id-users").doc(ID).update({
				last_login_date: new Date().getTime(),
				last_login_ip: clientInfo.clientIP
			})
			// 查询当前登录用户数据
			var userData = await dbjql.collection("uni-id-users").doc(ID).field(
				"_id,business,username,mobile,register_env,status").get({
				getOne: true
			})
			return {
				code: 200,
				message: '登陆成功',
				result: userData.data
			}

		} catch (error) {
			return {
				error: '内部错误',
				code: 500,
				message: err,
			};
			dbJQL.collection('users_log').add({
				type: 2,
				text: `店铺${Data.shop_id},在‘获取可提现金额’方法时发生错误：${err}`
			})
		}
	},
	
	
	
	/**
	 * 更新用户信息
	 * @param {string} shopID 商铺id
	 * @param {string} userID 商铺用户id
	 * @param {string} temp_clientid 临时客户端id
	 * @param {string} clientid 最新客户端id
	 * @returns {object} 返回值对象类型 code：200为正确调用
	 */
	async updatePushClientId(shopID, userID ,clientid ,temp_clientid ) {
		// 参数校验
		if (!shopID || !userID || !clientid || !temp_clientid ) {
			return {
				error: '参数不完整',
				code: 404,
				shopID,userID,clientid
			};
		}
		try {
			const deviceData = await dbjql.collection("uni-id-device").where({user_id: userID}).get({getOne: false,customUI:true})
			const clientInfo = this.getClientInfo()
			deviceData.data.map(item => {
				if ( item.push_clientid == temp_clientid )
					return dbjql.collection("uni-id-device").doc(item._id).update({push_clientid:clientid,create_date:new Date().getTime()})
			})
			var Data = {
				// 构建当前登录环境
				register_env: {
					appid: clientInfo.appId,
					uni_platform: clientInfo.platform,
					os_name: clientInfo.osName,
					app_name: clientInfo.appName,
					app_version: clientInfo.appVersion,
					app_version_code: clientInfo.appVersionCode,
					device_id: clientInfo.deviceId,
					ua: clientInfo.ua,
					channel: "userData-update",
					client_ip: clientInfo.clientIP
				},
				last_login_ip: clientInfo.clientIP,
				last_login_date: new Date().getTime(),
			}
			let data = await dbjql.collection("uni-id-users").doc(userID).update(Data)
			return {
				code: 200,
				message: '操作成功',
				result: data
			}

		} catch (error) {
			return {
				error: '内部错误',
				code: 500,
				message: err,
			};
			dbJQL.collection('users_log').add({
				type: 2,
				text: `店铺${shopID},在‘获取可提现金额’方法时发生错误：${err}`
			})
		}
	},
	/**
	 * 商家端手机号登录+验证是否为有效账号 - (web 适用) - 
	 * @param {string} ID 用户登录ID
	 * @returns {object} 返回值对象类型 code：200为正确调用
	 */
	async merchantPhoneLoginAndValidate(ID) {
		// 参数校验
		if (!ID) {
			return {
				messsage:'参数不完整',
				error: '请联系管理员',
				code: 404
			};
		}
		const dbjql = uniCloud.databaseForJQL()
		const db = uniCloud.database()
		try {
			let shopField = "title,location,business_status,create_time,disabled_status,create_uid,page_view,region,address,poiname,logo,categories,photo,tel,intro,create_uid,start_business_hours1,end_business_hours1,end_business_hours2,start_business_hours2"
			let shopAuthention = await dbjql.collection("shop").where({create_uid:ID}).field(shopField).get({getOne:true,customUI:true})
			if (shopAuthention.affectedDocs === 0) {
				return {
					code: 202,
					message: '登录失败',
					error:'当前账号未注册商铺或未审核通过',
					result:shopAuthention
				}
			}else{
				const clientInfo = this.getClientInfo()
				// 修改当前用户最后登陆环境
				await dbjql.collection("uni-id-users").doc(ID).update({
					last_login_date: new Date().getTime(),
					last_login_ip: clientInfo.clientIP
				})
				// 查询当前登录用户数据
				let userData = await dbjql.collection("uni-id-users").doc(ID).field(
					"_id,business,username,mobile,nickname,register_env,status").get({
					getOne: true
				})
				return {
					code: 200,
					message: '登陆成功',
					result: userData.data,
					shopAuthention:shopAuthention.data
				}
			}
		} catch (error) {
			return {
				message: '内部错误',
				code: 500,
				error:'建议先联系相关管理员'+err,
			};
			dbJQL.collection('users_log').add({
				type: 2,
				text: `店铺${Data.shop_id},在‘获取可提现金额’方法时发生错误：${err}`
			})
		}
	},
	/**
	 * 商家端手机号登录+验证 - (app 适用) - 
	 * @param {string} ID 用户登录ID
	 * @returns {object} 返回值对象类型 code：200为正确调用
		 200 OK - 请求成功，用户可以成功登录。
		 400 Bad Request - 请求错误，登录请求中不完整的信息-无参数。
		 403 Forbidden - 禁止访问，表示用户已经申请注册商铺，但是仍然在审核中。
		 404 Not Found - 请求错误，当前账号未注册商铺或未审核通过。
		 500 Internal Server Error - 服务器内部错误，表示服务器在处理登录请求时遇到了问题。
	 */
	async loginUserIdCheck(ID) {
		// 参数校验
		if (!ID) {
			return {
				messsage:'参数不完整',error: '请联系管理员',code: 400
			};
		}
		const dbjql = uniCloud.databaseForJQL()
		const db = uniCloud.database()
		const clientInfo = this.getClientInfo()
		try {
			const shopField = "title,location,business_status,create_time,disabled_status,create_uid,page_view,region,address,poiname,logo,categories,photo,tel,intro,create_uid,start_business_hours1,end_business_hours1,end_business_hours2,start_business_hours2"
			const shopStore = await dbjql.collection("shop").where({create_uid:ID}).field(shopField).get({getOne:true,customUI:true})
			// 修改当前用户最后登陆环境
			await dbjql.collection("uni-id-users").doc(ID).update({last_login_date: new Date().getTime(),  last_login_ip: clientInfo.clientIP})
			// 查询当前登录用户数据
			const userData = await dbjql.collection("uni-id-users").doc(ID).field("_id,business,username,mobile,nickname,register_env,status").get({getOne: true})
			if (shopStore.affectedDocs === 0)
			{
				const shopAuthenticationField = "create_date,create_uid,business_license_title,legal_person_name,audit_text,audit_status"
				const shopAuthentication = await dbjql.collection("shop_authentication").where({user_id: ID }).field(shopAuthenticationField).get({getOne:true,customUI:true})
				if(shopAuthentication.affectedDocs === 0){
					return {
						code: 404,
						message: '登录失败',
						error:'当前账号未注册商铺或未审核通过',
						result:userData.data,
						shopAuthentication,
						shopStore:null
					}
				}else{
					return {
						code: 403,
						message: '登录失败',
						error:'当前账号正在审核中',
						result:userData.data,
						shopAuthentication,
						shopStore:null
					}
				}
			}else
			{
				return {
					code: 200,
					message: '登陆成功',
					result: userData.data,
					shopStore:shopStore.data
				}
			}
		} catch (error) {
			return {
				message: '内部错误',code: 500,error:'建议先联系相关管理员'+err,
			};
			dbJQL.collection('users_log').add({type: 2,text: `店铺${Data.shop_id},在‘获取可提现金额’方法时发生错误：${err}`})
		}
	},
	/**
	 * 商家端手机端启动验证 - (app 适用) - 
	 * @param {string} ID 用户登录ID
	 * @returns {object} 返回值对象类型 code：200为正确调用
		 200 OK - 请求成功，用户可以成功登录。
		 400 Bad Request - 请求错误，登录请求中不完整的信息-无参数。
		 403 Forbidden - 禁止访问，表示用户已经申请注册商铺，但是仍然在审核中。
		 404 Not Found - 请求错误，当前账号未注册商铺或未审核通过。
		 500 Internal Server Error - 服务器内部错误，表示服务器在处理登录请求时遇到了问题。
	 */
	async firingVerifyIdentity(ID) {
		// 参数校验
		if (!ID) {
			return {
				messsage:'参数不完整',error: '请联系管理员',code: 400
			};
		}
		const dbjql = uniCloud.databaseForJQL()
		const db = uniCloud.database()
		const clientInfo = this.getClientInfo()
		try {
			const shopField = "title,create_uid,disabled_status"
			const shopStore = await dbjql.collection("shop").where({create_uid:ID}).field(shopField).get({getOne:true,customUI:true})
			// 查询当前登录用户数据
			if (shopStore.affectedDocs === 0)
			{
				const shopAuthenticationField = "create_date,create_uid"
				const shopAuthentication = await dbjql.collection("shop_authentication").where({user_id: ID }).field(shopAuthenticationField).get({getOne:true,customUI:true})
				if(shopAuthentication.affectedDocs === 0){
					return {
						code: 404,
						message: '登录失败',
						error:'当前账号未注册商铺或未审核通过',
					}
				}else{
					return {
						code: 403,
						message: '登录失败',
						error:'当前账号正在审核中',
					}
				}
			}else{
				return {
					code: 200,
					message: '登陆成功',
				}
			}
		} catch (error) {
			return {
				message: '内部错误',code: 500,error:'建议先联系相关管理员'+err,
			};
			dbJQL.collection('users_log').add({type: 2,text: `店铺${Data.shop_id},在‘获取可提现金额’方法时发生错误：${err}`})
		}
	},

}